#pragma once
//传输层协议 （单例模式）
#include"Socket.hpp"
class TcpServer
{
    private:
    uint16_t port_ ;//服务器端口号
    Sock listen_fd;// 服务器使用的网络套接字
    static TcpServer*ptr_;//用来实现单例
    static pthread_mutex_t lock_;
    private:
    TcpServer(const uint16_t&port)
    :port_(port)
    {

    }
    TcpServer(const TcpServer&)=delete;//禁止拷贝
    TcpServer&operator=(const TcpServer&)=delete;//禁止赋值
    public:
    Sock* Getsock()
    {
        return &listen_fd;
    }
    static TcpServer* GetInstance(uint16_t port)
    {
        //防止大量线程同时获取单例
        if(nullptr==ptr_)
        {
            //只有一小部分线程能进来到这里
            pthread_mutex_lock(&lock_);
            if(nullptr==ptr_)
            {
                ptr_=new TcpServer(port);
                ptr_->InitServer();//获取单例同时帮他初始化好
            }
            pthread_mutex_unlock(&lock_);
        }
        return ptr_;
    }
    void InitServer()
    {
        //服务器的初始化
        listen_fd.Socket();
        listen_fd.Bind(port_);
        listen_fd.Listen();
        lg(INFO,"InitServer success!! sockfd is:%d",listen_fd.Fd());

    }
    void StartServer()
    {
        //这里不干活了？
        // //服务器运行起来
        // for(;;)
        // {
        //     lg(DEBUG,"server start!!");
        // }
    }
    ~TcpServer()
    {

    }
    
};

//静态成员变量只能在类外定义
TcpServer* TcpServer::ptr_=nullptr;
pthread_mutex_t TcpServer::lock_=PTHREAD_MUTEX_INITIALIZER;//定义全局锁不需要初始化跟销毁